#include "drv_spi.h"

void drv_spi_init(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct ;
	SPI_InitTypeDef   SPI_InitStruct ;

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOE, ENABLE) ;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE) ;

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF ;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP ;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4 | GPIO_Pin_5 ;
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ;
	GPIO_Init( GPIOB, &GPIO_InitStruct) ;

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT ;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 ;
	GPIO_Init( GPIOB, &GPIO_InitStruct) ;

	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 ;
	GPIO_Init( GPIOE,&GPIO_InitStruct) ;

	GPIO_SetBits( GPIOE, GPIO_Pin_1) ;
	
	GPIO_PinAFConfig( GPIOB, GPIO_PinSource3,  GPIO_AF_SPI1); 
	GPIO_PinAFConfig( GPIOB, GPIO_PinSource4,  GPIO_AF_SPI1);
	GPIO_PinAFConfig( GPIOB, GPIO_PinSource5,  GPIO_AF_SPI1);

	SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4 ; 
	SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge ;
	SPI_InitStruct.SPI_CPOL = SPI_CPOL_High ;
	SPI_InitStruct.SPI_CRCPolynomial = 7 ;
	SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b ;
	SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex ;
	SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB ;
	SPI_InitStruct.SPI_Mode = SPI_Mode_Master ;
	SPI_InitStruct.SPI_NSS = SPI_NSS_Soft ;
	SPI_Init( SPI1, &SPI_InitStruct);
	SPI_Cmd( SPI1, ENABLE) ;
}


uint8_t drv_spi_wdata(uint8_t data)
{
	uint8_t read_data = 0 ;
	while (SPI_I2S_GetFlagStatus( SPI1,  SPI_I2S_FLAG_TXE) == RESET );
	SPI_I2S_SendData(SPI1,data);

	while (SPI_I2S_GetFlagStatus( SPI1,  SPI_I2S_FLAG_RXNE) == RESET );
	read_data = SPI_I2S_ReceiveData(SPI1) ;
	return read_data ;
}
